{
  Copyright 2012, Jameel Halabi

  This unit is part of the BlaiseWave wrapper,
  which is licensed under the BSD 2-Clause license (see licenses/license.txt).
}

unit BW_Instancing;

{$mode objfpc}{$H+}

interface

uses
  LW_Types      ,
  LW_Render     ,
  LW_Instancing ,
  BW_Global     ;

type

  { TItemInstancerFuncs }

  TItemInstancerFuncs = class(TGlobal)
  protected
    function GetGlobalType                   : String; override;
  public
    function  NumInstances
              (      Instancer : PLWItemInstancer ) : UInt32		  ;
    function  InstanceByIndex
              (      Instancer : PLWItemInstancer ;
        	     Index     : UInt32		  ) : PLWItemInstance ;
    function  First
              (      Instancer : PLWItemInstancer ) : PLWItemInstance ;
    function  Next
              (      Instancer : PLWItemInstancer ;
        	     Instance  : PLWItemInstance  ) : PLWItemInstance ;
    function  CreateInstance
              (      Instancer : PLWItemInstancer ) : PLWItemInstance ;
    procedure DestroyInstance
              (      Instancer : PLWItemInstancer ;
        	     Instance  : PLWItemInstance  ) ;
    procedure SetInstance
              (      Instancer : PLWItemInstancer ;
        	     ID        : UInt32           ;
        	     Item	   : PLWItem      ;
        	     Steps 	   : UInt32       ) ;
    procedure SetMotionStep
              (      Instance  : PLWItemInstance  ;
        	     Steps     : UInt32           ;
               const Pos       : TLWDVector       ;
               const Scl       : TLWDVector       ;
               const Rot       : TLWDVector       ) ;
    procedure SetMotions
              (      Instance  : PLWItemInstance  ;
        	     Steps     : UInt32           ;
               const Pos       : TLWDVector       ;
               const Scl       : TLWDVector       ;
               const Rot       : TLWDVector       ) ;
    procedure SetMotionStepM
              (      Instance  : PLWItemInstance  ;
        	     Steps     : UInt32           ;
               const Pos       : TLWDVector       ;
               const Matrix    : Array {[0..8]} of Double  ) ;
    procedure SetMotionsM
              (      Instance  : PLWItemInstance  ;
                     Steps     : UInt32           ;
               const Pos       : TLWDVector       ;
               const Matrix    : Array {[0..8]} of Double ) ;

    // GUI only
    procedure SetInstanceDrawer
              (      Instance  : PLWItemInstance  ;
        		 DrawMode  : Integer          ) ;  // Originally InstanceDrawerMode
    procedure SetInstanceDrawerColor
              (      Instance  : PLWItemInstance  ;
        	     Color     : UInt32           ) ; // Use RGB_(r, g, b) macro to make colors.

  end;

  { TInstancingInfo }

  TItemInstanceInfo = class(TGlobal)
  protected
    function GetGlobalType                   : String; override;
  public
    function  Item
              (      ItemInstID : PLWItemInstance ) : PLWItem  ;
    function  Steps
              (      ItemInstID : PLWItemInstance ) : UInt32   ;
    procedure Pos
              (      ItemInstID : PLWItemInstance ;
                     Step       : UInt32          ;
                     P 	 : TLWDVector      ) ;
    procedure Scale
              (      ItemInstID : PLWItemInstance ;
                     Step       : UInt32          ;
                     S          : TLWDVector      ) ;
    procedure Rotation
              (      ItemInstID : PLWItemInstance ;
                     Step       : UInt32          ;
                     R 	 : TLWDVector      ) ;
    function  ID
              (      ItemInstID : PLWItemInstance ) : UInt32   ;
    procedure Matrix
              (      ItemInstID : PLWItemInstance ;
                     Step       : UInt32          ;
                     M	         : array {[0..8]} of Double )   ;
  end;

implementation

{ TItemInstancerFuncs }

function TItemInstancerFuncs.GetGlobalType: String;
begin
  Result := LWITEMINSTANCERFUNCS_GLOBAL ;
end;

function TItemInstancerFuncs.NumInstances
                             (     Instancer : PLWItemInstancer ) : UInt32;
begin
  Result := PLWItemInstancerFuncs(FGlobal)^.NumInstances(Instancer);
end;

function TItemInstancerFuncs.InstanceByIndex
                             (     Instancer : PLWItemInstancer ;
                                   Index     : UInt32           ) : PLWItemInstance;
begin
  Result := PLWItemInstancerFuncs(FGlobal)^.InstanceByIndex(Instancer, Index);
end;

function TItemInstancerFuncs.First
                             (     Instancer : PLWItemInstancer ) : PLWItemInstance;
begin
  Result := PLWItemInstancerFuncs(FGlobal)^.First(Instancer);
end;

function TItemInstancerFuncs.Next
                             (     Instancer : PLWItemInstancer ;
                                   Instance  : PLWItemInstance  ) : PLWItemInstance;
begin
  Result := PLWItemInstancerFuncs(FGlobal)^.Next(Instancer, Instance);
end;

function TItemInstancerFuncs.CreateInstance
                             (     Instancer : PLWItemInstancer ) : PLWItemInstance;
begin
  Result := PLWItemInstancerFuncs(FGlobal)^.CreateInstance(Instancer);
end;

procedure TItemInstancerFuncs.DestroyInstance
                             (     Instancer : PLWItemInstancer ;
                                   Instance  : PLWItemInstance  ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.DestroyInstance(Instancer, Instance);
end;

procedure TItemInstancerFuncs.SetInstance
                             (     Instancer : PLWItemInstancer ;
                                   ID        : UInt32           ;
                                   Item      : PLWItem          ;
                                   Steps     : UInt32           ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetInstance(Instancer, ID, Item, Steps);
end;

procedure TItemInstancerFuncs.SetMotionStep
                             (     Instance  : PLWItemInstance  ;
                                   Steps     : UInt32           ;
                             const Pos       : TLWDVector       ;
                             const Scl       : TLWDVector       ;
                             const Rot       : TLWDVector       ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetMotionStep(Instance, Steps, Pos, Scl, Rot);
end;

procedure TItemInstancerFuncs.SetMotions
                             (     Instance  : PLWItemInstance  ;
                                   Steps     : UInt32           ;
                             const Pos       : TLWDVector       ;
                             const Scl       : TLWDVector       ;
                             const Rot       : TLWDVector       ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetMotions(Instance, Steps, Pos, Scl, Rot);
end;

procedure TItemInstancerFuncs.SetMotionStepM
                             (     Instance  : PLWItemInstance  ;
                                   Steps     : UInt32           ;
                             const Pos       : TLWDVector       ;
                             const Matrix    : array of Double  ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetMotionStepM(Instance, Steps, Pos, Matrix);
end;

procedure TItemInstancerFuncs.SetMotionsM
                             (     Instance  : PLWItemInstance  ;
                                   Steps     : UInt32           ;
                             const Pos       : TLWDVector       ;
                             const Matrix    : array of Double  ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetMotionsM(Instance, Steps, Pos, Matrix);
end;

procedure TItemInstancerFuncs.SetInstanceDrawer
                             (     Instance  : PLWItemInstance  ;
                                   DrawMode  : Integer          ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetInstanceDrawer(Instance, DrawMode);
end;

procedure TItemInstancerFuncs.SetInstanceDrawerColor
                             (     Instance  : PLWItemInstance  ;
                                   Color     : UInt32           ) ;
begin
  PLWItemInstancerFuncs(FGlobal)^.SetInstanceDrawerColor(Instance, Color);
end;

{ TInstancingInfo }

function TItemInstanceInfo.GetGlobalType: String;
begin
  Result := LWITEMINSTANCEINFO_GLOBAL ;
end;

function TItemInstanceInfo.Item
                           (      ItemInstID : PLWItemInstance ) : PLWItem  ;
begin
  Result := PLWItemInstanceInfo(FGlobal)^.Item(ItemInstID);
end;

function TItemInstanceInfo.Steps
                           (      ItemInstID : PLWItemInstance ) : UInt32;
begin
  Result := PLWItemInstanceInfo(FGlobal)^.Steps(ItemInstID);
end;

procedure TItemInstanceInfo.Pos
                           (      ItemInstID : PLWItemInstance ;
                                  Step       : UInt32          ;
                                  P          : TLWDVector      ) ;
begin
  PLWItemInstanceInfo(FGlobal)^.Pos(ItemInstID, Step, P);
end;

procedure TItemInstanceInfo.Scale
                           (      ItemInstID : PLWItemInstance ;
                                  Step       : UInt32          ;
                                  S          : TLWDVector      ) ;
begin
  PLWItemInstanceInfo(FGlobal)^.Pos(ItemInstID, Step, S);
end;

procedure TItemInstanceInfo.Rotation
                           (      ItemInstID : PLWItemInstance ;
                                  Step       : UInt32          ;
                                  R          : TLWDVector      ) ;
begin
  PLWItemInstanceInfo(FGlobal)^.Pos(ItemInstID, Step, R);
end;

function TItemInstanceInfo.ID
                           (      ItemInstID : PLWItemInstance ) : UInt32;
begin
  Result := PLWItemInstanceInfo(FGlobal)^.ID(ItemInstID);
end;

procedure TItemInstanceInfo.Matrix
                           (      ItemInstID : PLWItemInstance ;
                                  Step       : UInt32          ;
                                  M          : array of Double);
begin
  PLWItemInstanceInfo(FGlobal)^.Matrix(ItemInstID, Step, M);
end;

end.

